﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Net;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using MediaXenterWPF.UserControl;
using MediaXenterWPF.UserControl.Impostazioni;
using NetExp.MediaXenter.Database;
using NetExp.MediaXenter.Utilities;

namespace MediaXenterWPF.UserControl
{
    /// <summary>
    /// Interaction logic for PaginaImpostazioni.xaml
    /// </summary>
    public partial class PaginaImpostazioni
    {
        private SettingsDS _settingsDS = null;
        private KeyboardManager _keyboardManager;
        private ThemesResources _themesResources;
        private StyleHelper _styleHelper;
        public event Delegates.OnImpostazioniAnimazioneEnd OnImpostazioniAnimazioneEnd;
       
        private ImpostazioniVideo _impostazioniVideo = null;
        private ImpostazioniFoto _impostazioniFoto = null;
        private ImpostazioniMusica _impostazioniMusica = null;
        private ImpostazioniPlugin _impostazioniPlugin = null;
        private ImpostazioniRete _impostazioniRete = null;
        private ImpostazioniTelevisione _impostazioniTelevisione = null;

        public PaginaImpostazioni(SettingsDS settingsDS, KeyboardManager keyboardManager, ThemesResources themesResources, StyleHelper styleHelper)
        {
            this.InitializeComponent();
            _settingsDS = settingsDS;
            _keyboardManager = keyboardManager;
            _themesResources = themesResources;
            _styleHelper = styleHelper;
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            _impostazioniFoto = new ImpostazioniFoto();
            _impostazioniMusica = new ImpostazioniMusica();
            _impostazioniPlugin = new ImpostazioniPlugin();
            _impostazioniRete = new ImpostazioniRete();
            _impostazioniTelevisione = new ImpostazioniTelevisione();
            _impostazioniVideo = new ImpostazioniVideo(_settingsDS, _keyboardManager, _themesResources, _styleHelper, brdControllo.ActualWidth, brdControllo.ActualHeight);

            lblTitoloPagina.Content = LocalizationHelper.TranslateString(_settingsDS, lblTitoloPagina.Content.ToString());
            LoadPulsantiera();

        }

        private void LoadPulsantiera()
        {
            NavigationHelper navigationHelper = new NavigationHelper();
            List<string> pulsanti = navigationHelper.GetPulsantiImpostazioni(LocalizationHelper.GetLocalizationDocument(_settingsDS, Constants.LOCALIZATIONPATH));
            for (int i = 0; i < pulsanti.Count; i++)
            {
                Button button = CreaPulsante(pulsanti[i], i, 0,pulsanti.Count);
                double spazio = -1 * (button.Height + button.Margin.Top + button.Margin.Bottom);
                button = CreaPulsante(pulsanti[i], i, spazio,pulsanti.Count);
                stkRotazione.Children.Insert(0, button);
            }

            stkRotazione.Height = (((Button)stkRotazione.Children[0]).Height + ((Button)stkRotazione.Children[0]).Margin.Top + ((Button)stkRotazione.Children[0]).Margin.Bottom) * pulsanti.Count;
        }

        private Button CreaPulsante(SettingsDS.PulsantiRow pulsante, int indice, double spazio,int max)
        {
            return CreaPulsante(pulsante.Nome, indice, spazio,max);
        }

        private Button CreaPulsante(string nome, int indice, double spazio, int max)
        {
            TranslateTransform translate = new TranslateTransform(0, spazio);
            Button button = new Button();
            button.Content = string.Empty;
            button.Content = LocalizationHelper.TranslateString(_settingsDS, nome);
            button.Width = 223;
            button.RenderTransformOrigin = new System.Windows.Point(0.5, 0.5);
            button.Margin = new Thickness(0, 10, 0, 10);
            button.RenderTransform = translate;
            button.Height = 40;
            button.FontFamily = _styleHelper.FontNormale.FontFamily;
            button.FontSize = _styleHelper.FontNormale.FontSize;
            button.FontStyle = _styleHelper.FontNormale.Style;
            button.FontWeight = _styleHelper.FontNormale.Weight;
            button.Foreground = new SolidColorBrush(_styleHelper.FontNormale.Color);

            if (indice == max - 1)
            {

                button.Style = (Style)FindResource("MediaButtonSelected");
            }
            else
            {
                button.Style = (Style)FindResource("MediaButton");
            }

            return button;
        }

        public void AnimazionePulsanti(Key pulsante)
        {

            if (pulsante == _keyboardManager.MoveUp)
            {
                bool trovato = false;
                for (int i = stkRotazione.Children.Count - 1; i >= 0; i--)
                {
                    Button button = (Button)stkRotazione.Children[i];

                    if (button.Style == (Style)FindResource("MediaButtonSelected"))
                    {
                        button.Style = (Style)FindResource("MediaButton");
                        trovato = true;

                        if (i == 0)
                        {
                            ((Button)stkRotazione.Children[stkRotazione.Children.Count - 1]).Style = (Style)FindResource("MediaButtonSelected");
                            SelectedVoice();

                        }
                    }
                    else
                    {
                        if (trovato)
                        {
                            button.Style = (Style)FindResource("MediaButtonSelected");
                            SelectedVoice();
                        }
                        else
                            button.Style = (Style)FindResource("MediaButton");
                        trovato = false;
                    }

                }
            }
            else if (pulsante == _keyboardManager.MoveDown)
            {
                bool trovato = false;
                for (int i = 0; i < stkRotazione.Children.Count; i++)
                {
                    Button button = (Button)stkRotazione.Children[i];

                    if (button.Style == (Style)FindResource("MediaButtonSelected"))
                    {
                        button.Style = (Style)FindResource("MediaButton");
                        trovato = true;

                        if (i == stkRotazione.Children.Count - 1)
                        {
                            ((Button)stkRotazione.Children[0]).Style = (Style)FindResource("MediaButtonSelected");
                            SelectedVoice();

                        }
                    }
                    else
                    {
                        if (trovato)
                        {
                            button.Style = (Style)FindResource("MediaButtonSelected");
                            SelectedVoice();
                        }
                        else
                            button.Style = (Style)FindResource("MediaButton");
                        trovato = false;
                    }

                }
            }


        }

        private ImageSource GetImage(string testo)
        {
            string converted = LocalizationHelper.OriginalString(_settingsDS, testo, Constants.LOCALIZATION_AREA_PAGINA_PRINCIPALE);

            if (converted == "S0101")
                return _themesResources.Video;
            else if (converted == "S0102")
                return _themesResources.Musica;
            else if (converted == "S0103")
                return _themesResources.Foto;
            else if (converted == "S0104")
                return _themesResources.Impostazioni;
            else if (converted == "S0105")
                return _themesResources.Plugin;
            else if (converted == "S0106")
                return _themesResources.Televisione;

            return null;

        }

        internal PagePosition GetSelectedPage()
        {
            PagePosition position = new PagePosition();
            foreach (Button button in stkRotazione.Children)
            {
                if (button.Style == (Style)FindResource("MediaButtonSelected"))
                {
                    string valoreOrig = CompareString(button.Content.ToString());
                    if (valoreOrig == "S0101")
                    {
                        position = PagePosition.Video;
                    }
                    else if (valoreOrig == "S0102")
                    {
                        position = PagePosition.Musica;
                    }
                    else if (valoreOrig == "S0103")
                    {
                        position = PagePosition.Foto;
                    }
                    else if (valoreOrig == "S0104")
                    {
                        position = PagePosition.Impostazioni;
                    }
                    else if (valoreOrig == "S0105")
                    {
                        position = PagePosition.Plugin;
                    }
                    else if (valoreOrig == "S0106")
                    {
                        position = PagePosition.Televisione;
                    }
                    break;
                }
            }
            return position;
        }

        private string CompareString(string nome)
        {
            foreach (SettingsDS.PulsantiRow riga in _settingsDS.Pulsanti)
            {
                string valore = LocalizationHelper.TranslateString(_settingsDS, riga.Nome);
                if (valore == nome)
                    return riga.Nome;
            }
            return nome;
        }

        void sb_Completed(object sender, EventArgs e)
        {
            if (OnImpostazioniAnimazioneEnd != null)
                OnImpostazioniAnimazioneEnd();
        }

        internal void ReductionAnimation()
        {

            Duration duration = new Duration(TimeSpan.FromSeconds(1));


            Storyboard sb = new Storyboard();
            sb.Completed += new EventHandler(sb_Completed);
            sb.Duration = duration;
            sb.Children.Add(AnimationHelper.AnimationScaleY(duration, brdContenitore, 1, 0));
            sb.Children.Add(AnimationHelper.AnimationScaleX(duration, brdContenitore, 1, 0));
            sb.Children.Add(AnimationHelper.AnimationTranslateTransformY(duration, brdContenitore, 0, -200));
            sb.Children.Add(AnimationHelper.AnimationScaleY(duration, stkRotazione, 1, 0));
            sb.Children.Add(AnimationHelper.AnimationScaleX(duration, stkRotazione, 1, 0));
            sb.Children.Add(AnimationHelper.AnimationTranslateTransformY(duration, stkRotazione, 0, -200));
            sb.Begin();
        }

        internal void ZoomAnimation()
        {
            Duration duration = new Duration(TimeSpan.FromSeconds(1));


            Storyboard sb = new Storyboard();
            sb.Duration = duration;
            sb.Children.Add(AnimationHelper.AnimationScaleY(duration, brdContenitore, 0, 1));
            sb.Children.Add(AnimationHelper.AnimationScaleX(duration, brdContenitore, 0, 1));
            sb.Children.Add(AnimationHelper.AnimationTranslateTransformY(duration, brdContenitore, -200, 0));
            sb.Children.Add(AnimationHelper.AnimationScaleY(duration, stkRotazione, 0, 1));
            sb.Children.Add(AnimationHelper.AnimationScaleX(duration, stkRotazione, 0, 1));
            sb.Children.Add(AnimationHelper.AnimationTranslateTransformY(duration, stkRotazione, -200, 0));
            sb.Begin();
        }

        private void SelectedVoice()
        {
            string content = string.Empty;
            for (int i = 0; i < stkRotazione.Children.Count; i++)
            {
                Button button = (Button)stkRotazione.Children[i];
                if (button.Style == (Style)FindResource("MediaButtonSelected"))
                {
                    content = button.Content.ToString();
                    break;
                }
            }

            brdControllo.Children.Clear();
            switch (GetSelectedVoice(content))
            {
                case ImpostazioniPosition.Video:
                    brdControllo.Width = brdContenitore.ActualWidth;
                    brdControllo.Height = brdContenitore.ActualHeight;
                    _impostazioniVideo.SetDimension(brdControllo.Width, brdControllo.Height);
                    brdControllo.Children.Add(_impostazioniVideo);
                    break;
                case ImpostazioniPosition.Musica:
                    brdControllo.Children.Add(_impostazioniMusica);
                    break;
                case ImpostazioniPosition.Foto:
                    brdControllo.Children.Add(_impostazioniFoto);
                    break;
                case ImpostazioniPosition.Plugin:
                    brdControllo.Children.Add(_impostazioniPlugin);
                    break;
                case ImpostazioniPosition.Televisione:
                    brdControllo.Children.Add(_impostazioniTelevisione);
                    break;
                case ImpostazioniPosition.Rete:
                    brdControllo.Children.Add(_impostazioniRete);
                    break;
            }
        }

        private ImpostazioniPosition GetSelectedVoice(string content)
        {
            string originale = LocalizationHelper.OriginalString(_settingsDS, content, "S02");

            if (originale == "S0201")
                return ImpostazioniPosition.Video;
            else if (originale == "S0202")
                return ImpostazioniPosition.Musica;
            else if (originale == "S0203")
                return ImpostazioniPosition.Foto;
            else if (originale == "S0204")
                return ImpostazioniPosition.Plugin;
            else if (originale == "S0205")
                return ImpostazioniPosition.Televisione;
            else if (originale == "S0206")
                return ImpostazioniPosition.Rete;
            else
                return ImpostazioniPosition.Nessuno;

        }

        internal ImpostazioniPosition GetImpostazioniSelectedPage()
        {
            ImpostazioniPosition position = new ImpostazioniPosition();
            foreach (Button button in stkRotazione.Children)
            {
                if (button.Style == (Style)FindResource("MediaButtonSelected"))
                {
                    string valoreOrig = CompareString(button.Content.ToString());
                    if (valoreOrig == "S0201")
                    {
                        position = ImpostazioniPosition.Video;
                    }
                    else if (valoreOrig == "S0202")
                    {
                        position = ImpostazioniPosition.Musica;
                    }
                    else if (valoreOrig == "S0203")
                    {
                        position = ImpostazioniPosition.Foto;
                    }
                    else if (valoreOrig == "S0204")
                    {
                        position = ImpostazioniPosition.Plugin;
                    }
                    else if (valoreOrig == "S0205")
                    {
                        position = ImpostazioniPosition.Televisione;
                    }
                    else if (valoreOrig == "S0206")
                    {
                        position = ImpostazioniPosition.Rete;
                    }
                    break;
                }
            }
            return position;
        }

        internal void ClearButtonSelection()
        {
            for (int i = 0; i < stkRotazione.Children.Count; i++)
            {
                Button button = (Button)stkRotazione.Children[i];
                if (button.Style == (Style)FindResource("MediaButtonSelected"))
                {
                    button.Style = (Style)FindResource("MediaButton");
                    break;
                }
            }
        }

        internal void SetSubSelection(ImpostazioniPosition position)
        {
            switch (position)
            {
                case ImpostazioniPosition.Video:
                    _impostazioniVideo.SetSelection();
                    break;
                case ImpostazioniPosition.Musica:
                    break;
                case ImpostazioniPosition.Foto:
                    break;
                case ImpostazioniPosition.Plugin:
                    break;
                case ImpostazioniPosition.Televisione:
                    break;
                case ImpostazioniPosition.Rete:
                    break;
                case ImpostazioniPosition.Nessuno:
                    break;
                default:
                    break;
            }
        }

        internal void AnimazioneSubPulsanti(ImpostazioniPosition impostazioniPosition, Key key)
        {
            switch (impostazioniPosition)
            {
                case ImpostazioniPosition.Video:
                    _impostazioniVideo.AnimazionePulsanti(key);
                    break;
                case ImpostazioniPosition.Musica:
                    break;
                case ImpostazioniPosition.Foto:
                    break;
                case ImpostazioniPosition.Plugin:
                    break;
                case ImpostazioniPosition.Televisione:
                    break;
                case ImpostazioniPosition.Rete:
                    break;
                case ImpostazioniPosition.Nessuno:
                    break;
                default:
                    break;
            }
        }
    }
}
